{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "1dfd7ec3",
      "metadata": {
        "id": "1dfd7ec3"
      },
      "source": [
        "# Getting started with Bifrost\n",
        "\n",
        "These tutorials require an installation of Bifrost and a machine with a GPU. The simplest way to start is using Google Colab. There are tips for other ways to run them in [the README](https://github.com/lwa-project/bifrost/blob/master/tutorial/README.md).\n",
        "\n",
        "<a href=\"https://colab.research.google.com/github/lwa-project/bifrost/blob/master/tutorial/00_getting_started.ipynb\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open in Colab\"></a>\n",
        "\n",
        "Once Bifrost is installed you can load the Python API with\n",
        "```python\n",
        "import bifrost\n",
        "```"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "proud-container",
      "metadata": {
        "id": "proud-container"
      },
      "outputs": [],
      "source": [
        "%%capture install_log\n",
        "# Import bifrost, but attempt to auto-install if needed (and we're running on\n",
        "# Colab). If something goes wrong, evaluate install_log.show() in a new block\n",
        "# to retrieve the details.\n",
        "try:\n",
        "  import bifrost\n",
        "except ModuleNotFoundError:\n",
        "  try:\n",
        "    import google.colab\n",
        "    !sudo apt-get -qq install universal-ctags libopenblas-dev software-properties-common build-essential\n",
        "    !pip install -q contextlib2 pint simplejson scipy ctypesgen==1.0.2\n",
        "    ![ -d ~/bifrost/.git ] || git clone https://github.com/lwa-project/bifrost ~/bifrost\n",
        "    !(cd ~/bifrost && ./configure && make -j all && sudo make install)\n",
        "    import bifrost\n",
        "  except ModuleNotFoundError:\n",
        "    print(\"Sorry, could not import bifrost and we're not on colab.\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "rental-equipment",
      "metadata": {
        "id": "rental-equipment"
      },
      "source": [
        "This loads the core parts of Bifrost and several useful functions.  The main way of interacting with Bifrost is through the `bifrost.ndarray`, a sub-class of `numpy.ndarray`.  You can create an empty array with:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "subject-quebec",
      "metadata": {
        "id": "subject-quebec",
        "outputId": "35f71b57-fd1b-4113-ad3d-5e7430ad603e",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<class 'bifrost.ndarray.ndarray'> float32 (2, 4096) system\n",
            "[[ 2.2875120e-35  0.0000000e+00  1.5581004e-38 ...  1.3563156e-19\n",
            "   2.8297670e+20  2.6373977e+23]\n",
            " [ 2.0704474e-19  7.1220526e+28  1.4251251e-13 ...  2.7550649e-40\n",
            "   6.1529782e-39 -5.7935773e-05]]\n"
          ]
        }
      ],
      "source": [
        "data = bifrost.ndarray(shape=(2,4096), dtype='f32', space='system')\n",
        "print(type(data), data.dtype, data.shape, data.bf.space)\n",
        "print(data)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "eleven-omaha",
      "metadata": {
        "id": "eleven-omaha"
      },
      "source": [
        "Note that bifrost defines datatypes differently to numpy:\n",
        "```\n",
        "f32: 32-bit float (equivalent to numpy float32)\n",
        "cf32: complex 32-bit data (equivalent to numpy complex64)\n",
        "i[8,16,32]: signed integer datatypes of 8, 16 and 32-bit width\n",
        "u[8,16,32]: unsigned integer datatypes of 8, 16 and 32-bit width\n",
        "ci[4,8,16,32]: complex 4-bit per sample, 8-bit, 16-bit and 32-bit datatypes\n",
        "```\n",
        "\n",
        "The `ci4`, `ci8` and `ci16` datatypes do not have an equivalent numpy type, but are commonly encountered in radio astronomy.\n",
        "\n",
        "You can also use the `bifrost.ndarray` to wrap existing numpy arrays:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "lightweight-madrid",
      "metadata": {
        "id": "lightweight-madrid",
        "outputId": "e0b40abb-6d54-4fa8-d552-36d73feea486",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<class 'bifrost.ndarray.ndarray'> float64 (2, 4096) system\n",
            "r: [[-0.3415904   0.07395837  1.1215293  ...  0.52340138 -0.43369748\n",
            "   0.99678685]\n",
            " [-0.74268647  1.9056947  -0.23712155 ...  0.65987519  1.13804761\n",
            "   0.36587976]]\n",
            "data: [[-0.3415904   0.07395837  1.1215293  ...  0.52340138 -0.43369748\n",
            "   0.99678685]\n",
            " [-0.74268647  1.9056947  -0.23712155 ...  0.65987519  1.13804761\n",
            "   0.36587976]]\n"
          ]
        }
      ],
      "source": [
        "import numpy\n",
        "r = numpy.random.randn(2, 4096)\n",
        "data = bifrost.ndarray(r)\n",
        "print(type(data), data.dtype, data.shape, data.bf.space)\n",
        "print('r:', r)\n",
        "print('data:', data)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "earlier-latino",
      "metadata": {
        "id": "earlier-latino"
      },
      "source": [
        "Since `bifrost.ndarray`s are derived from numpy arrays they can do many (but not all) of the same things:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "regional-darkness",
      "metadata": {
        "id": "regional-darkness",
        "outputId": "90fef638-53cf-4c47-9c85-da83fc6dbaf1",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "data += 2.0: [[1.6584096  2.07395837 3.1215293  ... 2.52340138 1.56630252 2.99678685]\n",
            " [1.25731353 3.9056947  1.76287845 ... 2.65987519 3.13804761 2.36587976]]\n",
            "data[0,:] = 55: [[55.         55.         55.         ... 55.         55.\n",
            "  55.        ]\n",
            " [ 1.25731353  3.9056947   1.76287845 ...  2.65987519  3.13804761\n",
            "   2.36587976]]\n"
          ]
        }
      ],
      "source": [
        "data += 2.0\n",
        "print('data += 2.0:', data)\n",
        "data[0,:] = 55\n",
        "print('data[0,:] = 55:', data)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "artificial-spider",
      "metadata": {
        "id": "artificial-spider",
        "outputId": "a27f7776-1f3c-45e1-8320-43d3ed6a2d5a",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "data[:,[1,3,5,7]] = 10: [[55.         55.         55.         ... 55.         55.\n",
            "  55.        ]\n",
            " [ 1.25731353  3.9056947   1.76287845 ...  2.65987519  3.13804761\n",
            "   2.36587976]]\n"
          ]
        }
      ],
      "source": [
        "data[:,[1,3,5,7]] = 10\n",
        "print('data[:,[1,3,5,7]] = 10:', data)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "thirty-stretch",
      "metadata": {
        "id": "thirty-stretch"
      },
      "source": [
        "You can also use `bifrost.ndarray`s with [numba](https://numba.pydata.org/):"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "smaller-organizer",
      "metadata": {
        "id": "smaller-organizer",
        "outputId": "6bfd54c2-16e7-4fdb-b5ce-3155ae447ce9",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<class 'bifrost.ndarray.ndarray'> [[65.         65.         65.         ... 65.         65.\n",
            "  65.        ]\n",
            " [11.25731353 13.9056947  11.76287845 ... 12.65987519 13.13804761\n",
            "  12.36587976]]\n"
          ]
        }
      ],
      "source": [
        "from numba import jit\n",
        "\n",
        "@jit(nopython=True)\n",
        "def compute(x):\n",
        "    for i in range(len(x)):\n",
        "        x[i] = x[i] + 10\n",
        "\n",
        "compute(data)\n",
        "print(type(data), data)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "informative-brush",
      "metadata": {
        "id": "informative-brush"
      },
      "source": [
        "### Arrays on the CPU and GPU"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "acute-efficiency",
      "metadata": {
        "id": "acute-efficiency"
      },
      "source": [
        "Unlike numpy arrays `bifrost.ndarray` are \"space aware\", meaning that they can exist in different memory spaces.  What we have created so far is in system memory.  `bifrost.ndarray`s can also exist in \"cuda_host\" (pinned) memory and \"cuda\" (GPU) memory:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "changing-enhancement",
      "metadata": {
        "id": "changing-enhancement",
        "outputId": "8def579b-b38e-44dc-efbc-2b59655a8185",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<class 'bifrost.ndarray.ndarray'> float32 (2, 4096) cuda_host\n",
            "<class 'bifrost.ndarray.ndarray'> float32 (2, 4096) cuda\n"
          ]
        }
      ],
      "source": [
        "data2 = bifrost.ndarray(shape=(2,4096), dtype='f32', space='cuda_host')\n",
        "data3 = bifrost.ndarray(shape=(2,4096), dtype='f32', space='cuda')\n",
        "print(type(data2), data2.dtype, data2.shape, data2.bf.space)\n",
        "print(type(data3), data3.dtype, data3.shape, data3.bf.space)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "million-guess",
      "metadata": {
        "id": "million-guess"
      },
      "source": [
        "To move between the different spaces the `bifrost.ndarray` class provides a `copy` method:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "talented-lending",
      "metadata": {
        "id": "talented-lending",
        "outputId": "575c6d4e-009f-45cc-de40-5b19aa96b27e",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "<class 'bifrost.ndarray.ndarray'> float64 (2, 4096) cuda\n"
          ]
        }
      ],
      "source": [
        "data4 = data.copy(space='cuda')\n",
        "print(type(data4), data4.dtype, data4.shape, data4.bf.space)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "stable-instrumentation",
      "metadata": {
        "id": "stable-instrumentation"
      },
      "source": [
        "Once on the GPU you can take advantage of Bifrost's GPU-based functions, like `bifrost.map`:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "prospective-financing",
      "metadata": {
        "id": "prospective-financing",
        "outputId": "f8b315b1-1a21-4e7b-f4b4-38af5ed37c11",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "data4/data = data*10/data = 10: [[10. 10. 10. ... 10. 10. 10.]\n",
            " [10. 10. 10. ... 10. 10. 10.]]\n"
          ]
        }
      ],
      "source": [
        "bifrost.map(\"a(i,j) *= 10\",\n",
        "            {'a': data4},\n",
        "            axis_names=('i', 'j'),\n",
        "            shape=data4.shape)\n",
        "data4 = data4.copy(space='system')\n",
        "print('data4/data = data*10/data = 10:', data4/data)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "amateur-bridges",
      "metadata": {
        "id": "amateur-bridges"
      },
      "source": [
        "The `bifrost.map` call here compiles and runs a CUDA kernel that does an element-wise multiplication by ten.  In order to view the results of this kernel call we need to copy the memory back to the \"system\" memory space.  In the future we hope to support a \"cuda_managed\" space to make this easier."
      ]
    },
    {
      "cell_type": "markdown",
      "id": "vocational-archives",
      "metadata": {
        "id": "vocational-archives"
      },
      "source": [
        "`bifrost.map` is an example of a function that does not require any additional setup to run. This code is converted into a CUDA kernel at runtime, using [NVRTC](https://docs.nvidia.com/cuda/nvrtc/index.html). \n",
        "\n",
        "For some Bifrost functions, like `bifrost.fft.Fft`, some setup is required so that the function knows how to run. To show the use of the Bifrost FFT, let us first make some example data on the GPU, using `bf.map`:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "restricted-carrier",
      "metadata": {
        "id": "restricted-carrier",
        "outputId": "4645aa43-2fbe-47eb-c051-727cef930472",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 297
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.legend.Legend at 0x7f5922a78290>"
            ]
          },
          "metadata": {},
          "execution_count": 12
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "data = bifrost.ndarray(shape=(16, 4096), dtype='cf32', space='cuda')\n",
        "bifrost.map(\"a(i,j) = exp(Complex<float>(0.0, 2*3.14*i*j/4096))\",\n",
        "            {'a': data},\n",
        "            axis_names=('i', 'j'),\n",
        "            shape=data.shape)\n",
        "data2 = data.copy(space='system')\n",
        "\n",
        "import pylab\n",
        "pylab.plot(data2[0,:].real, label='Re0')\n",
        "#pylab.plot(data2[0,:].imag, label='Im0')\n",
        "pylab.plot(data2[2,:].real, label='Re2')\n",
        "#pylab.plot(data2[2,:].imag, label='Im2')\n",
        "pylab.plot(data2[5,:].real, label='Re5')\n",
        "#pylab.plot(data2[5,:].imag, label='Im5')\n",
        "pylab.xlabel('Time')\n",
        "pylab.ylabel('Value')\n",
        "pylab.legend(loc=0)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "soviet-conference",
      "metadata": {
        "id": "soviet-conference"
      },
      "source": [
        "Now run the FFT and plot the results. The FFT is initialised using its `.init` method, and then executed using its `.execute` method.  An output data array also needs to be pre-allocated :"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "moral-worship",
      "metadata": {
        "id": "moral-worship",
        "outputId": "df15893d-a150-41dc-bd17-d76a73f04deb",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 297
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.legend.Legend at 0x7f59227d2350>"
            ]
          },
          "metadata": {},
          "execution_count": 13
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "source": [
        "fdata = bifrost.ndarray(shape=data.shape, dtype='cf32', space='cuda')\n",
        "f = bifrost.fft.Fft()\n",
        "f.init(data, fdata, axes=1, apply_fftshift=True)\n",
        "f.execute(data, fdata)\n",
        "fdata2 = fdata.copy(space='system')\n",
        "ffreqs = numpy.fft.fftfreq(fdata2.shape[1], d=1/4096.)\n",
        "ffreqs = numpy.fft.fftshift(ffreqs)\n",
        "\n",
        "pylab.semilogy(ffreqs, numpy.abs(fdata2[0,:])**2, label='0')\n",
        "pylab.semilogy(ffreqs, numpy.abs(fdata2[2,:])**2, label='2')\n",
        "pylab.semilogy(ffreqs, numpy.abs(fdata2[5,:])**2, label='5')\n",
        "pylab.xlabel('Frequency')\n",
        "pylab.ylabel('Power')\n",
        "pylab.xlim(-10, 10)\n",
        "pylab.xticks([-10,-5,0,2,5,10])\n",
        "pylab.legend(loc=0)"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.6"
    },
    "colab": {
      "name": "00_getting_started.ipynb",
      "provenance": []
    },
    "accelerator": "GPU",
    "gpuClass": "standard"
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
